package com.biwin.core.api.session;

import org.springframework.security.core.Authentication;

import java.util.concurrent.TimeUnit;

/**
 * TODO
 *
 * @author biwin
 * @since 0.0.1
 */
public interface ISessionProvider<T> {

    /**
     * 获取指定账户在线的信息
     *
     * @param account 登录账号
     * @return
     */
    T getUserInfo(String account);

    /**
     * 设置登录用户信息
     *
     * @param onlineUserInfoVo 在线用户信息
     */
    void setUserInfo(T onlineUserInfoVo);

    /**
     * 即刻失效指定账户的登录信息
     *
     * @param account 登录账号
     */
    void invalidUserInfo(String account);

    /**
     * 获取指定 username 的 jwtToken
     *
     * @param username
     * @return
     */
    String getJwtToken(String username);

    /**
     * 根据用户创建 jwtToken
     *
     * @param authentication
     * @param timeOut
     * @return
     */
    String createJwtToken(T authentication, long timeOut);

    /**
     * 验证 Token 字符串合法性
     *
     * @param authToken token 字符串
     * @return true 合法
     */
    boolean validateTokenStr(String authToken);

    /**
     * 刷新 token
     *
     * @param token
     * @return
     */
    Authentication refreshToken(String token);

    /**
     * 检查指定用户的在线用户数是否大于
     *
     * @param username
     * @return
     */
    boolean checkMaxNum(String username);

    /**
     * 移除指定账号最先登录的 token
     *
     * @param username
     */
    void logoutFirstToken(String username);
}
